// server.cpp : Defines the entry point for the console application.
//




#include "stdafx.h"
#include "winSock.h"
#include "EnDeCode.h"
#include "stdlib.h"
#include "stdio.h"
#include "Dali_Platform.h"
#include "Dali_CmdPacket.h"



#define DIM(x) (sizeof((x))/sizeof((x)[0]))



void usage(char *name)
{
fprintf(stderr, "usage: %s [port]\n", name);
}



// ӡ pa(ָ룬)
void pa(void *ptr, int count)
{
for(int i=0; i<count; i++)
{
  printf("%.2X ", *((unsigned char*)ptr+i));
}
printf("\n");
}
int main(int argc,char *argv[])
{
SOCKET servsock,clisock;
struct sockaddr_in sa;
struct sockaddr_in cliaddr; /* ŷصĿͻַϢ */
int len;
int err;
int servport = 50000; /* ĬϷ˿ */



WSADATA wsd;
printf("*****************************************************************\n");
printf("*                     IIģ                *\n");
printf("*                     xy2 Online server simulator               *\n");
printf("*                                                               *\n");
printf("*                           Version 0.0.6                       *\n");
printf("*                                                               *\n");
printf("*                      2004-09-01 Ver 0.0.1-0.0.2               *\n");
printf("*                      2005-06-23 Ver 0.0.3-0.0.4               *\n");
printf("*                      2005-06-26 Ver 0.0.5                     *\n");
printf("*                      2005-07-01 Ver 0.0.6                     *\n");
printf("*                                                               *\n");
//printf("*                                       *\n");
printf("*                                                               *\n");
//printf("*  Copyright (C) 2004-2005, . All Rights Reserved.  *\n");
printf("*****************************************************************\n");



/*
  Ver 0.0.1-0.0.2  ʹýȡļֽܷɫ½
  Ver 0.0.3-0.0.4  ʹü㷨ʵֽɫ½
  Ver 0.0.5   ʹ÷
  Ver 0.0.6   
*/
    /* в */
if (argc > 2) {
  usage(argv[0]);
  return -1;
}



// ȡĶ˿
if (argc == 2) {
  servport = atoi(argv[1]);
  if (servport > 65535 || servport < 1) {
   usage(argv[0]);
   return -2;
  }
}



/* ʼWinsock1.1 */
if (WSAStartup(MAKEWORD(1,1), &wsd) != 0) {
  printf("WSAStartup() ʧ !\n");
  return -3;
}



/* ׽ */
printf("׽ ...\n");
servsock = socket(AF_INET, SOCK_STREAM, 0);
if (servsock == INVALID_SOCKET) {
  fprintf(stderr, "socket() ʧ: %d\n", WSAGetLastError());
  return -4;
}
printf("[ɴ]\n");



/* ַṹ */
memset(&sa, 0, sizeof(sa));
sa.sin_family   = AF_INET;
sa.sin_port    = htons(servport);
sa.sin_addr.S_un.S_addr = htonl(INADDR_ANY);



/* ׽ֵַṹ */
printf(" ...\n");
err = bind(servsock, (const sockaddr *)&sa,sizeof(sa));
if (err != 0) {
  fprintf(stderr, "bind() ʧ: %d\n", WSAGetLastError());
  return -5;
}
printf("[ɰ]\n");



/* ׽ */
printf(" ...\n");
err = listen(servsock,5);
if (err != 0) {
  fprintf(stderr, "listen() ʧ: %d\n", WSAGetLastError());
  return -6;
}
printf("[ɼ]\n");



/* ѭ */
while(1) {
  printf("ȴ ...\n");
  len = sizeof(cliaddr);
  clisock = accept(servsock, (struct sockaddr *)&cliaddr, &len);
  if (clisock == INVALID_SOCKET) {
   fprintf(stderr, "accept() ʧ: %d\n", WSAGetLastError());
   closesocket(servsock);
   return -7;
  }
  
  printf("ܿͻ %s:%d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));



  //  4ֽԿ
  //char buff[] = "\x10\x05\x00\x9B\x16\x06\x98\x00";
  //send(clisock, buff,8, 0); /* ͸ͻ */
  SetSeed(0x9806169B); /* 㷨 */
  
  CDali_CmdPacket cmd;
  cmd.WriteByte('\x10'); // ָ
  cmd.WriteShort(5); // 
  cmd.WriteLong(0x9806169B); // 
  cmd.WriteByte('\x00'); // 
  char *buff;
  buff=cmd.GetData();
  send(clisock,buff,8,0);



  if (recv(clisock, buff, sizeof(buff), 0) != SOCKET_ERROR)
  {
  }
  if (recv(clisock, buff, sizeof(buff), 0) != SOCKET_ERROR)
  {
  }



  if (recv(clisock, buff, sizeof(buff), 0) != SOCKET_ERROR)
  {
   // 1
   // ʾϵͳϢ



   CDali_CmdPacket Cmd1;
   //Cmd1.BeginRead(buff,8);
   Cmd1.WriteByte('\xFF'); // ָ
   Cmd1.WriteShort(27); // 
   Cmd1.WriteString("ӭģ磡"); // Ϣ
   Cmd1.WriteByte('\x00'); // 
   buff=Cmd1.GetData(); // 
   buff=Encrypt(buff,30);/*  */
   send(clisock, buff,30, 0); // ͸ͻ 




   // 2
   // ȷϢ(ӦȷʺĻӦ)



   CDali_CmdPacket Cmd2;
   Cmd2.WriteByte('\x1F'); // ָ
   Cmd2.WriteShort(2); // 
   Cmd2.WriteByte('\x00'); // Ƿȷ 00ȷ01
   Cmd2.WriteByte('\x00');// 
   buff=Cmd2.GetData(); // 
   buff=Encrypt(buff,5); /*  */
   send(clisock,buff,5,0); //  

   // 3
   // Ϸʼ -- κû½һ
   char buff2[]="\x11\x82\x00\x81\x4E\x00\x00\xE0\xF8\xBF\xBF\x05\xCC\x10\x08\xDC\x07\x68\x08\x8A\x0F\x00\x00\xF0\xF8\xBF\xBF\x05\xCC\x10\x08\xCC\xF7\x67\x08\xDC\x07\x68\x08\x68\xF7\x67\x08\x74\xDA\x07\x08\xCC\xF7\x67\x08\xDC\x07\x68\x08\x68\xF7\x67\x08\x9E\xEA\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00\x50\xF9\xBF\xBF\xB3\x48\x1F\x48\xC9\x01\x00\x00\xD4\xCB\xCD\x1F\x1A\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x70\xED\x1F\xFF\x07\x00\x00\x94\x48\x1F\x48\x00\xC0\xCD\x1F\x00\x00\x00\x00\xE8\x11\x1B\x08\x81\x00\x00\x00\xB8\x76\xED\x1F\x00\x00";
   //char buff2[]="\x11\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";



   //char buff2[]="\x11\x82\x00\x06\x4E\x00\xFF\x01\x00\x00\x00\x02\x00\x00\x00\xB3\x6E\x8F\x64\xA0\x1F\x01\x00\x00\x00\x8F\x64\x33\xC9\x10\x08\x7C\x89\x87\x08\xD8\xE6\x27\x1E\xE8\x03\x00\x00\x00\x00\x00\x00\xFE\xDB\x7C\x52\x06\x00\x00\x00\x7C\x89\x87\x08\x64\x02\x01\x00\x00\x00\x00\x00\xD5\x00\x00\x00\x20\xF9\xBF\xBF\xB3\x48\x1F\x48\xA5\x00\x00\x00\x1C\xD6\x55\x1F\x0F\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x90\x12\x20\xFF\x07\x00\x00\x94\x48\x1F\x48\x00\xC0\x55\x1F\x20\x01\x00\x00\xC8\x13\x00\x00\x10\x00\x00\x00\x99\x92\x12\x20\x00\x00";
   //char buff2[]="\x11\x82\x00\x06\x4E\x00\xFF\x01\x00\x00\x00\x02\x00\x00\x00\x1B\x1C\x96\x51\x28\xBB\x01\x00\x00\x00\x96\x51\x33\xC9\x10\x08\xA4\xB0\x58\x08\xC8\x79\x29\x1E\xE8\x03\x00\x00\x00\x00\x00\x00\xDA\xFF\xFF\xFF\x12\x00\x00\x00\xA4\xB0\x58\x08\x47\x5C\x0E\x08\x00\x60\xE9\x48\xD7\x02\x00\x00\x20\xF9\xBF\xBF\xB3\x48\x1F\x48\xB7\x02\x00\x00\x25\xDC\x39\x1F\x1E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x07\x00\x00\x94\x48\x1F\x48\x00\xD0\x39\x1F\x00\x60\xE9\x48\x50\xF9\xBF\xBF\x01\x00\x00\x00\xD5\xD5\x39\x1F\x00\x00";
     char *buff2a;
   buff2a=Encrypt(buff2,133);
   send(clisock, buff2a,133, 0);



   // 4
   // ѡɫ



   for(int j=1;j<6;j++)
   {
   CDali_CmdPacket Cmd3;
   Cmd3.WriteByte('\x12'); // ָ
   Cmd3.WriteShort(72); // 
   Cmd3.WriteLong(1*j); // ID
   Cmd3.WriteShort(15+j); // ɫ
   Cmd3.WriteByte('\x01'); // Ա
   Cmd3.WriteByte('\x03'); // 
   Cmd3.WriteString("",20); // ɫ
   Cmd3.WriteString("ʥת",20); // ν
   Cmd3.WriteByte('\xFF'); // ȼ
   Cmd3.WriteString("ɫǹ",20); // 
   Cmd3.WriteShort(j); // ?? 4ֽ
   Cmd3.WriteByte('\x00'); // 
   buff=Cmd3.GetData();
   buff=Encrypt(buff,75);
   send(clisock, buff,75, 0);
   }
  }



  if (recv(clisock, buff, sizeof(buff), 0) != SOCKET_ERROR)
  {
  }
  if (recv(clisock, buff, sizeof(buff), 0) != SOCKET_ERROR)
  {
  }



  if (recv(clisock, buff, sizeof(buff), 0) != SOCKET_ERROR)
  {
   // 5
   // IPͶ˿(127.0.0.1:50000)



   CDali_CmdPacket Cmd4;
   Cmd4.WriteByte('\x16'); // ָ
   Cmd4.WriteShort(19); // 
   Cmd4.WriteString("127.0.0.1",16); // IPַ
   Cmd4.WriteShort(50000); // Port ˿
   Cmd4.WriteByte('\x00'); // 
   buff=Cmd4.GetData();
   buff=Encrypt(buff,22);
   send(clisock, buff,22, 0);



   // 6
   // ȷϢ

   CDali_CmdPacket Cmd5;
   Cmd5.WriteByte('1F'); // ָ
   Cmd5.WriteShort(2); // 
   Cmd5.WriteByte('\x00'); // Ƿȷ 00Ϊȷ01Ϊ
   Cmd5.WriteByte('\x00'); // 
   buff=Cmd5.GetData();
   buff=Encrypt(buff,5);
   send(clisock, buff,5, 0); 




   // 7
   // ɫϢ



   CDali_CmdPacket Cmd6;
   Cmd6.WriteByte('\x20'); // ָ
   Cmd6.WriteShort(150); // 
   Cmd6.WriteLong(1); // ID
   Cmd6.WriteByte('\x0F'); // ??
   Cmd6.WriteShort(15); // ɫ
   Cmd6.WriteString("",20); // ɫ
   Cmd6.WriteByte('\x03'); // 
   Cmd6.WriteByte('\x01'); // Ա
   Cmd6.WriteString("ʥת",20); // ν
   Cmd6.WriteLong(10000); // ǰHP
   Cmd6.WriteLong(12000); // HP
   Cmd6.WriteLong(213); // ǰMP
   Cmd6.WriteLong(343); // MP
   Cmd6.WriteLong(32424); // ǰ
   Cmd6.WriteLong(100); // ǰ
   Cmd6.WriteLong(300); // һ
   Cmd6.WriteLong(2314); // ս
   Cmd6.WriteLong(10000000); // Ǯ
   Cmd6.WriteLong(20000000); // 
   Cmd6.WriteString("ɫǹ",20); // 
   Cmd6.WriteByte('\x01'); // Ƿа
   Cmd6.WriteByte('\xFF'); // ȼ
   Cmd6.WriteShort(255); // HP ӵ
   Cmd6.WriteShort(255); // MP ӵ
   Cmd6.WriteShort(255); // AP ӵ
   Cmd6.WriteShort(255); // SP ӵ
   Cmd6.WriteLong(43532); // APֵ
   //Cmd6.WriteLong(0); // ??
   Cmd6.WriteByte('\x01');
   Cmd6.WriteByte('\x01');
   Cmd6.WriteByte('\x01');
   Cmd6.WriteByte('\x01');
   Cmd6.WriteLong(234234); // SP ֵ
   Cmd6.WriteShort(512); // ɷ
   Cmd6.WriteByte('\x20'); // ϵͳ
   Cmd6.WriteLong(3434522); // Ҫľֵ
   //Cmd6.WriteLong(0); // ??
   Cmd6.WriteByte('\x00');
   Cmd6.WriteByte('\x00');
   Cmd6.WriteByte('\x00');
   Cmd6.WriteByte('\x00');
   Cmd6.WriteLong(5); // ܼ
   Cmd6.WriteByte('\x02'); // ת־
   Cmd6.WriteShort(15); // ɫ
   Cmd6.WriteByte('\x00'); // 
   buff=Cmd6.GetData();
   //pa(buff,150);
   buff=Encrypt(buff,153);
   send(clisock,buff,153,0);



   // 8
   // ٻ



   for(int i=1;i<11;i++)
   {
   CDali_CmdPacket Cmd8;
   Cmd8.WriteByte('\xB1'); // ָ
   Cmd8.WriteShort(111); // 
   Cmd8.WriteLong(2*i); // NPCID
   Cmd8.WriteString("֩",20); // ɫ
   Cmd8.WriteShort(2035+i*i); // ɫ
   Cmd8.WriteByte('\xFF'); // 
   Cmd8.WriteLong(100*i+i); // ǰHP
   Cmd8.WriteLong(200*i+i); // ǰMP
   Cmd8.WriteLong(300*i+i); // ǰAP
   Cmd8.WriteLong(400*i+i); // ǰSP
   Cmd8.WriteByte('\x64'); // ҳ
   Cmd8.WriteShort(10*i+i); // HPӵ
   Cmd8.WriteShort(20*i+i); // MPӵ
   Cmd8.WriteShort(30*i+i); // APӵ
   Cmd8.WriteShort(40*i+i); // SPӵ
   Cmd8.WriteShort(50*i+i); // ɷ
   Cmd8.WriteLong(1000*i+i); // ǰ
   Cmd8.WriteLong(2000*i+i); // HP
   Cmd8.WriteLong(3000*i+i); // MP
   Cmd8.WriteLong(4000*i+i); // ǰ辭
   Cmd8.WriteLong(5000*i+i); // һ辭
   Cmd8.WriteString("",18); // ??
   Cmd8.WriteString("",18); // ??
   Cmd8.WriteByte('\x00'); // 
   buff=Cmd8.GetData();
   buff=Encrypt(buff,114);
   send(clisock,buff,114,0);
   }




   // 9
   // 



   CDali_CmdPacket Cmd9;
   Cmd9.WriteByte('\x50'); // ָ
   Cmd9.WriteShort(7); // 
   Cmd9.WriteShort(1001); // ͼ
   Cmd9.WriteShort(215); // X 
   Cmd9.WriteShort(70); // Y 
   Cmd9.WriteByte('\x00'); // 
   buff=Cmd9.GetData();
   buff=Encrypt(buff,10);
   send(clisock,buff,10,0);



   CDali_CmdPacket Cmd10;
   Cmd10.WriteByte('\x53'); // ָ
   Cmd10.WriteShort(16); // 
   Cmd10.WriteLong(1500000); // NPCID
   Cmd10.WriteShort(2035); // ɫ
   Cmd10.WriteShort(205); // X 
   Cmd10.WriteShort(72); // Y 
   Cmd10.WriteByte('\x01'); // 
   Cmd10.WriteString("",20); // ɫ
   Cmd10.WriteByte('\x00'); // 
   buff=Cmd10.GetData();
   buff=Encrypt(buff,19);
   send(clisock,buff,19,0);
}



  //closesocket(clisock); /* رͻ */
  printf("[]\n");
}

closesocket(servsock); /* رշ׽ */
WSACleanup(); /* ͷԴ */
return 0;
}
